home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / tex / macros / source / contrib / fp / fp-random.sty < prev    next >
Text File  |  1995-03-09  |  2KB  |  93 lines

  1. \NeedsTeXFormat{LaTeX2e}
  2. \ProvidesPackage{fp-random}[1995/02/17]
  3.  
  4. % Version information
  5. \def\FP@randomversion{1.0}
  6. \message{%
  7.   `Fixed Point Random,%
  8.   \space\space\space\space\space\space\space\space\space\space\space\space%
  9.   Version \FP@randomversion%
  10.   \space(C) Denis Girou (CNRS/IDRIS)%
  11. }
  12.  
  13. % Resolve dependencies
  14. \RequirePackage{fp-basic}
  15.  
  16. % Uniform random value
  17.  
  18. \newcount\FPseed                % Seed value
  19.  
  20. \def\FPrandom#1{%
  21.   % #1 macro, which gets the result
  22.   %
  23.   % Uniform random number generator (numbers between 0 and 1)
  24.   %
  25.   % Algorithm reproduce from a very old Fortran program (unknown origin!)
  26.   %
  27.   %       double precision function RANF()
  28.   %
  29.   %       integer SEED
  30.   %       common /COMSEED/SEED
  31.   % *
  32.   %       integer A,M,Q,R
  33.   %       parameter(A=16807,M=2147483647,Q=127773,R=2836)
  34.   % *
  35.   %       integer LO,HI,TEST
  36.   % *
  37.   %       HI = SEED/Q
  38.   %       LO = SEED-HI*Q
  39.   %       TEST = A*LO-R*HI
  40.   %       if(TEST.gt.0) then
  41.   %         SEED = TEST
  42.   %       else
  43.   %         SEED = TEST+M
  44.   %       endif
  45.   % *
  46.   %       RANF = DFLOAT(SEED)/DFLOAT(M)
  47.   % *
  48.   %       end
  49.   %
  50.   %   The macro used a seed value, defined by the counter \FPseed.
  51.   % If it's unknown at first call, we used an arbitrary value.
  52.   %
  53.   %   We verify that we obtain the same results as in Fortran
  54.   %
  55.   {\FP@beginmessage{RANDOM}%
  56.    %
  57.    \ifnum\FPseed=0%
  58.      \FPseed=123456789%
  59.      \FP@debug{random: seed value undefined! We will used \the\FPseed.^^J%
  60.             Define it if you want to generate a different sequence of random%
  61.         numbers.}%
  62.    \else%
  63.      \FP@debug{random: seed value used: \the\FPseed}%
  64.    \fi%
  65.    %
  66.    \FP@xia=\FPseed%
  67.    \divide\FP@xia by 127773%
  68.    \FP@xib=\FP@xia%
  69.    \multiply\FP@xib by 127773%
  70.    \advance\FP@xib by -\FPseed%
  71.    \FP@xib=-\FP@xib%
  72.    \multiply\FP@xia by 2836%
  73.    \FPseed=\FP@xib%
  74.    \multiply\FPseed by 16807%
  75.    \advance\FPseed by -\FP@xia%
  76.    %
  77.    \ifnum\FPseed>0%
  78.    \else%
  79.       \advance\FPseed by 2147483647%
  80.    \fi%
  81.    \FPdiv\FP@tmpa{\the\FPseed}{2147483647}%
  82.    \global\let\FP@tmp\FP@tmpa%
  83.    \global\FPseed=\FPseed%
  84.    \FP@debug{random: random number: \FP@tmp\space%
  85.               (new seed value: \the\FPseed)}%
  86.    %
  87.    \FP@endmessage{}%
  88.   }%
  89.   \let#1\FP@tmp%
  90. }
  91.  
  92. \endinput
  93.